//
//  DemoBranch.swift
//  swiftDemo
//
//  Created by JIENING ZHANG on 2020/1/8.
//  Copyright © 2020 lovivid. All rights reserved.
//

import UIKit

class DemoBranch: NSObject {
    class func isLeapYear(_ year:Int) -> Bool {
        
        if(0 == year%400) {
            // 能被400整除的年份是闰年
            return true;
        }
        
        if(0 == year%100) {
            // 不能被400整除 但是能被100整除的年份是 平年
            return false;
            
        } else if(0 == year%4) {
            // 不能被100整除，但是能被4整除的年份是 润年
            return true;
            
        } else {
        
            // 其他的年份是平年
            return false;
        }
    }
    
    class func dayNumOfYear(_ year:Int, _ month:Int) -> Int {

        var dayNum = 0;
        
        switch (month) {
            case 1 : dayNum = 31;
            case 3 : dayNum = 31;
            case 5 : dayNum = 31;
            case 7 : dayNum = 31;
            case 8 : dayNum = 31;
            case 10: dayNum = 31;
            case 12: dayNum = 31;
            case 4 : dayNum = 30;
            case 6 : dayNum = 30;
            case 9 : dayNum = 30;
            case 11: dayNum = 30;
            case 2 : dayNum = isLeapYear(year) ? 29 : 28
            default: dayNum = 0;
        }
        
        return dayNum;
    }
    
    
    /**
     2019年1月1日 是周二，以此为基准，计算一个日期对应的星期

     @param year 闭区间[-2000, 4000]
     @param month 1base
     @param day 1base
     @return 1base week day, -1 if not a valid day
     */
    class func computeWeekDayOfYear(_ year:Int, _ month:Int, _ day:Int) -> Int {
        //

         //入参校验
        if !(year >= -2000 && year<=4000) {
            // 年数字不合法
            return -1
        }

        let monthDayNum = dayNumOfYear(year, month)
        if 0 == monthDayNum {
            // 月数字不合法
            return -1
        }
        
        if day < 1 || day > monthDayNum {
             // 日数字不合法
            return -1
        }
        
        // 计算和基准日期的差值, 2019年1月1日 是周二
        let baseYear = 2019
        let baseMonth = 1
        let baseDay = 1
        let baseWeekDay = 1 // 周二，但是用 0 base, 记为1
        
        var diffDayNum : Int = 0
        
        // 计算累加 年的天数差值
        var tmpY = baseYear
        while(tmpY > year) {
            // 如果baseyear 比较大，逐年减小之，按平闰年累加 diffDayNum
            tmpY -= 1
            diffDayNum -= isLeapYear(tmpY) ? 366 : 365
        }
        while(tmpY < year) {
            // 如果baseyear 比较小，逐年增大之，按平闰年累加 diffDayNum
            diffDayNum += isLeapYear(tmpY) ? 366 : 365
            tmpY+=1
        }
        
        // 计算累加 月的天数差值
        var tmpM = baseMonth
        while tmpM < month {
            // baseMonth 一定不大于 month
            // 逐月增加，累加月份天数到 diffDayNum
            diffDayNum += dayNumOfYear(year, tmpM)
            tmpM+=1
        }
        
        // 计算累加 日的天数差值
        diffDayNum += day-baseDay
        
        var weekDay = (baseWeekDay + diffDayNum)%7; // 计算 0 base 星期几
        if(weekDay < 0){
            weekDay += 7
        }
        
        weekDay += 1 // 换算成 1 base 星期几
        
        return weekDay
    }
    
    class func demoLogic() {
        for y in 1999...2020 {
            
            for m in 2...12 {
                
                let days = dayNumOfYear(y, m);
                print("\(y)年\(m)月有\(days)天");
                
                for d in 26...31 {
                    
                    let weekDay = computeWeekDayOfYear(y, m, d)
                    
                    let weekStr:String = weekDay<0 ? "无效日期" : "星期\(weekDay)"
                    
                    print("\(y)年\(m)月\(d)日 -> " + weekStr)
                    //break;
                }
                
                break;
            }
            //break;
        }
    }
}
